class Module {
  //定义容器
  static collection = {}
  //   定义模块格式
  static register(name, modules, action) {
    //将依赖模块提取
    const userModules = modules.map((m) => {
      const module = Module.collection[m]
      if (!module) throw new Error(`${m}模块不存在`)
      return module
    })
    //将模块压入到仓库里
    Module.collection[name] = action.apply(null, userModules)
  }
}
// 创建一个工具模块Util
Module.register('Util', [], function () {
  return {
    // 求和
    sum(data, field) {
      if (!Array.isArray(data)) throw new Error('数据必须为数组类型')
      //使用reduce()求和
      return data.reduce((sum, v) => {
        return sum + v[field]
      }, 0)
    },

    // 求平均值
    avg(data, field) {
      //对处理的数据的验证,判断数据是否为数组类型
      if (!Array.isArray(data)) throw new Error('数据必须为数组类型')

      return (
        //使用reduce()求和，然后算平均值
        this.sum(data, field) / data.length
      )
    },
  }
})
//注册个Day模块
Module.register('Day', [], function () {
  return {
    format() {
      return 'day format method'
    },
  }
})

// 注册个User模块，依赖Util模块和Day模块
Module.register('User', ['Util', 'Day'], function (Util) {
  const users = [
    { name: '李四', age: 20 },
    { name: '二狗', age: 30 },
    { name: '大力', age: 40 },
  ]
  const res = Util.avg(users, 'age')
  console.log(res)
})

// 注册个商品模块
Module.register('Goods', ['Util', 'Day'], function (Util) {
  const goods = [
    { name: 'Ipad', price: 3800 },
    { name: 'MacBook Air', price: 7800 },
    { name: 'MacBook Pro', price: 13800 },
    { name: 'MacBook M1', price: 15800 },
    { name: 'IWatch', price: 2800 },
  ]
  const res = Util.sum(goods, 'price')
  console.log(`你的购物车货物总计为:${res}`)
})
